/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.desa.view.mbean;

import com.brain.core.view.mbean.*;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ParametroDto;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.RecursosManager;
import com.brain.desa.manager.EvaluacionCompetenciaManager;

import com.brain.desa.dto.EvaluacionCompetenciaArbolDto;
import com.brain.desa.dto.EvaluacionCompetenciaDto;
import com.brain.desa.manager.EvaluacionCompetenciaArbolManager;
import com.brain.desa.view.util.ConstantesDesa;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.model.SelectItem;
import javax.persistence.Transient;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Indra
 */
@Controller("evaluacionCompetenciaArbolMBean")
@Scope("session")
public class EvaluacionCompetenciaArbolMBean extends GenericMBean implements Serializable {
    
    private static Logger logger = Logger.getLogger(EvaluacionCompetenciaArbolMBean.class);
    @Resource
    private EvaluacionCompetenciaArbolManager manager;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private EvaluacionCompetenciaManager evaluacionCompetenciaManager;
    private List<EvaluacionCompetenciaArbolDto> lista;
    private List<ParametroDto> listaCalificacion;
    private EvaluacionCompetenciaArbolDto dtoFiltro;
    private EvaluacionCompetenciaArbolDto dto;
    private EvaluacionCompetenciaDto evaluacionCompetenciaDto;
    private String keyTitulo = "arbol.evaluacion.competencia.panel";
    private TreeNode evaluacionCompetenciaArbol;
    private TreeNode selectedArbolEvaluacionCompetenciaArbol;
    private EvaluacionCompetenciaArbolDto evaluacionCompetenciaArbolPrincipal;
    private EvaluacionCompetenciaArbolDto evaluacionCompetenciaArbolSeleccionadoDto;
    private SelectItem[] siTipoEvaluacion;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;
    @Transient
    private BigDecimal promedioFinal;
    
    public EvaluacionCompetenciaArbolMBean() {
        this.dtoFiltro = new EvaluacionCompetenciaArbolDto();
    }
    
    public String iniciar() {
        this.dto = null;
        this.lista = null;
        this.dtoFiltro = new EvaluacionCompetenciaArbolDto();
        return ConstantesDesa.UrlNavegacion.URL_EVALUACION_COMPETENCIA;
    }
    
    public void buscar() {
        try {
            this.evaluacionCompetenciaArbolPrincipal = this.manager.obtenerPorEvaluacionCompetencia(this.evaluacionCompetenciaDto.getId());
            this.evaluacionCompetenciaArbol = cargarevaluacionCompetenciaArbol(this.evaluacionCompetenciaArbolPrincipal);
            this.evaluacionCompetenciaArbol.setExpanded(true);
            this.evaluacionCompetenciaArbol.setSelectable(false);
        } catch (DAOException ex) {
            showError("Error de Sistema", ex.getMessage());
        }
    }
    
    public void agregarEvaluacion() {
        try {
            this.dto.setPromedio(BigDecimal.valueOf(this.dto.getCalificacion()));
            this.manager.editar(this.dto);
            this.calcularPromedios(this.dto);
            
            //this.evaluacionCompetenciaDto.setPromedio(this.dto.getPromedio());
            //this.evaluacionCompetenciaManager.editar(evaluacionCompetenciaDto);
           
            this.buscar();
            showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok"));
        } catch (Exception ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
    }
    
    private void actualizarPromedioPadre(EvaluacionCompetenciaArbolDto dto1) {        
        
        try {            
            EvaluacionCompetenciaArbolDto t = this.manager.obtenerPadre(dto1);
            List<EvaluacionCompetenciaArbolDto> lista = this.manager.obtenerHijosPorId(t);
            BigDecimal promedio = BigDecimal.ZERO;
            
            
            for (EvaluacionCompetenciaArbolDto e : lista) {
            //    System.out.println("hijos " + e.getDescripcion() + "   "+ e.getPromedio());
                
                promedio = promedio.add(e.getPromedio());
                
            }
            //System.out.println(promedio);
            
            promedio = UtilCore.Numero.dividir(promedio, BigDecimal.valueOf(lista.size()), 2);
            t.setPromedio(promedio);                        
            this.manager.editar(t);
            this.promedioFinal=promedio;
          //  System.out.println("Promedio Padre : " + t.getDescripcion() + " " + promedio);
            
        } catch (DAOException ex) {
            logger.error(ex);
        }
        
    }
    
    private void calcularPromedios(EvaluacionCompetenciaArbolDto dto1) {
        
        /*actualizando el tipo*/
        actualizarPromedioPadre(dto1);
        
        /*actualizando el elemento*/
        EvaluacionCompetenciaArbolDto e = null;
        try {        
            e = this.manager.obtenerPadre(dto1);
            actualizarPromedioPadre(e);
        } catch (DAOException ex) {
            logger.error(ex);
        }
        
        /*actualizando la competencia*/
        EvaluacionCompetenciaArbolDto c = null;
        try {        
            c = this.manager.obtenerPadre(e);
            actualizarPromedioPadre(c);
        } catch (DAOException ex) {
            logger.error(ex);
        }
        
        /*actualizando la funcion*/
        EvaluacionCompetenciaArbolDto f = null;
        try {        
            f = this.manager.obtenerPadre(c);
            actualizarPromedioPadre(f);
        } catch (DAOException ex) {
            logger.error(ex);
        }
        
        /*actualizando el proposito*/
        EvaluacionCompetenciaArbolDto p = null;
        try {        
            p = this.manager.obtenerPadre(f);
            this.evaluacionCompetenciaDto.setPromedio(p.getPromedio());
            this.evaluacionCompetenciaManager.editar(evaluacionCompetenciaDto);
            actualizarPromedioPadre(p);
        } catch (DAOException ex) {
            logger.error(ex);
        }
//        
//        System.out.println("ENTRO : " + dto1.getDescripcion());
//        int suma = 0;
//        int cont = 0;
//        try {
//            if (dto1.getId_aux() != null) {
//                List<EvaluacionCompetenciaArbolDto> hijos = this.manager.obtenerHijosPorId(dto1);
//                //System.out.println("SIZE : " + hijos.size());
//                if (hijos != null && !hijos.isEmpty()) {
//                    
//                    suma = 0;
//                    cont = 0;
//                    for (EvaluacionCompetenciaArbolDto h : hijos) {
//                        // System.out.println("TIPO : " + h.getTipo() + " DESCRIPCION : " + h.getDescripcion());
//                        calcularPromedios(h);
//                        cont++;
//                        suma += h.getCalificacion();
//                        
//                    }
//                }
//                if (cont > 0) {
//                    //System.out.println("SUMA : " + suma + "CONT : " + cont );
//                    dto1.setPromedio(BigDecimal.valueOf(suma / cont));
//                    System.out.println("TITULO : " + dto1.getDescripcion() + " ----  PROMEDIO : " + suma + " / " + cont + " = " + dto1.getPromedio());
//                    //this.manager.editar(dto1);
//                }
//            }
//        } catch (Exception ex) {
//            logger.error("ERROR DE SISTEMA", ex);
//            showError(ex.getMessage());
//        }
    }

    //////////////////////////////
    public void guardar() {
        
        this.manager.guardar(this.dto);
        //showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok"));
        //this.evaluacionCompetenciaArbol = cargarevaluacionCompetenciaArbol(this.evaluacionCompetenciaArbolPrincipal);
        EvaluacionCompetenciaMBean evalComp = (EvaluacionCompetenciaMBean) WebServletContextListener.getApplicationContext().getBean("evaluacionCompetenciaMBean");
        evalComp.editar();
        this.buscar();
    }
    
    public String retroceder() {
        sessionMBean.setAccion(ConstantesDesa.Formulario.LISTA);
        sessionMBean().setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean().getAccion()));
        return ConstantesDesa.UrlNavegacion.URL_LISTA_EVALUACION_COMPETENCIA;
    }
    
    private TreeNode cargarevaluacionCompetenciaArbol(EvaluacionCompetenciaArbolDto evaluacionCompetenciaArbolPrincipal) {
        
        TreeNode nodoDefecto = new DefaultTreeNode(new EvaluacionCompetenciaArbolDto(), null);
        nodoDefecto.setExpanded(true);
        //nodoDefecto.setSelectable(false);
        TreeNode nodoInicial = new DefaultTreeNode(evaluacionCompetenciaArbolPrincipal, nodoDefecto);
        nodoInicial.setExpanded(true);
        //nodoDefecto.setSelectable(false);
        recursividadArbol(nodoInicial);
        
        return nodoDefecto;
    }
    
    private TreeNode recursividadArbol(TreeNode tree) {
        
        try {
            EvaluacionCompetenciaArbolDto inicial = (EvaluacionCompetenciaArbolDto) tree.getData();
            if (inicial.getId_aux() != null) {
                List<EvaluacionCompetenciaArbolDto> hijos = this.manager.obtenerHijosPorId(inicial);
                if (hijos != null && hijos.size() != 0) { //tiene hijos
                    UtilCore.General.ordena(hijos, "descripcion");
                    for (EvaluacionCompetenciaArbolDto x : hijos) {
                        TreeNode t1 = new DefaultTreeNode(x, tree);
                        t1.setExpanded(true);
                        recursividadArbol(t1);
                    }
                }
                
            }
            
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
            
        } catch (Exception ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
            
        }
        return null;
    }
    
    public void editarEvaluacionCompetenciaArbol() {
        this.evaluacionCompetenciaArbolSeleccionadoDto = (EvaluacionCompetenciaArbolDto) selectedArbolEvaluacionCompetenciaArbol.getData();
        this.dto = this.evaluacionCompetenciaArbolSeleccionadoDto;
        if (this.dto.getPadre() == null) {
            mensajeAlerta();
        } else if (this.dto.getTipo().equals("D")) {
            sessionMBean.setAccion(ConstantesDesa.Formulario.EDITAR);
        } else {
            mensajeAlerta();
        }
    }
    
    public void nuevoEvaluacionCompetenciaArbol() {
        this.evaluacionCompetenciaArbolSeleccionadoDto = (EvaluacionCompetenciaArbolDto) selectedArbolEvaluacionCompetenciaArbol.getData();
        this.dto = new EvaluacionCompetenciaArbolDto();
        this.dto.setPadre(this.evaluacionCompetenciaArbolSeleccionadoDto.getId_aux());
        if (this.evaluacionCompetenciaArbolSeleccionadoDto.getPadre() == null) {
            mensajeAlerta();
        } else if (this.evaluacionCompetenciaArbolSeleccionadoDto.getTipo().equals("T")) {
            validaciondeHijos("D", "clave");
        } else {
            mensajeAlerta();
        }
        
        sessionMBean.setAccion(ConstantesDesa.Formulario.NUEVO);
    }
    
    public void validaciondeHijos(String Tipo, String Mensaje) {
        int totalPorNodo = 0;
        FacesMessage msg = null;
        RequestContext context = RequestContext.getCurrentInstance();
        try {
            totalPorNodo = this.manager.obtenerHijosPorId(this.evaluacionCompetenciaArbolSeleccionadoDto).size();
            
            boolean loggedIn = false;
            context.addCallbackParam("loggedIn", loggedIn);
            this.dto.setTipo(Tipo);
            this.dto.setEvaluacionCompetenciaDto(evaluacionCompetenciaDto);
            this.dto.setNumeracion(totalPorNodo + 1L);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
    }
    
    public void mensajeAlerta() {
        FacesMessage msg = null;
        RequestContext context = RequestContext.getCurrentInstance();
        showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.arbol.evaluacion.competencia"));
        boolean loggedIn = true;
        context.addCallbackParam("loggedIn", loggedIn);
    }
    
    public static Logger getLogger() {
        return logger;
    }
    
    public static void setLogger(Logger logger) {
        EvaluacionCompetenciaArbolMBean.logger = logger;
    }
    
    public EvaluacionCompetenciaArbolManager getManager() {
        return manager;
    }
    
    public void setManager(EvaluacionCompetenciaArbolManager manager) {
        this.manager = manager;
    }
    
    public RecursosManager getRecursosManager() {
        return recursosManager;
    }
    
    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }
    
    public EvaluacionCompetenciaManager getEvaluacionCompetenciaManager() {
        return evaluacionCompetenciaManager;
    }
    
    public void setEvaluacionCompetenciaManager(EvaluacionCompetenciaManager evaluacionCompetenciaManager) {
        this.evaluacionCompetenciaManager = evaluacionCompetenciaManager;
    }
    
    public List<EvaluacionCompetenciaArbolDto> getLista() {
        return lista;
    }
    
    public void setLista(List<EvaluacionCompetenciaArbolDto> lista) {
        this.lista = lista;
    }
    
    public EvaluacionCompetenciaArbolDto getDtoFiltro() {
        return dtoFiltro;
    }
    
    public void setDtoFiltro(EvaluacionCompetenciaArbolDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }
    
    public EvaluacionCompetenciaArbolDto getDto() {
        return dto;
    }
    
    public void setDto(EvaluacionCompetenciaArbolDto dto) {
        this.dto = dto;
    }
    
    public EvaluacionCompetenciaDto getEvaluacionCompetenciaDto() {
        return evaluacionCompetenciaDto;
    }
    
    public void setEvaluacionCompetenciaDto(EvaluacionCompetenciaDto evaluacionCompetenciaDto) {
        this.evaluacionCompetenciaDto = evaluacionCompetenciaDto;
    }
    
    public String getKeyTitulo() {
        return keyTitulo;
    }
    
    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }
    
    public TreeNode getEvaluacionCompetenciaArbol() {
        return evaluacionCompetenciaArbol;
    }
    
    public void setEvaluacionCompetenciaArbol(TreeNode evaluacionCompetenciaArbol) {
        this.evaluacionCompetenciaArbol = evaluacionCompetenciaArbol;
    }
    
    public TreeNode getSelectedArbolEvaluacionCompetenciaArbol() {
        return selectedArbolEvaluacionCompetenciaArbol;
    }
    
    public void setSelectedArbolEvaluacionCompetenciaArbol(TreeNode selectedArbolEvaluacionCompetenciaArbol) {
        this.selectedArbolEvaluacionCompetenciaArbol = selectedArbolEvaluacionCompetenciaArbol;
    }
    
    public EvaluacionCompetenciaArbolDto getEvaluacionCompetenciaArbolPrincipal() {
        return evaluacionCompetenciaArbolPrincipal;
    }
    
    public void setEvaluacionCompetenciaArbolPrincipal(EvaluacionCompetenciaArbolDto evaluacionCompetenciaArbolPrincipal) {
        this.evaluacionCompetenciaArbolPrincipal = evaluacionCompetenciaArbolPrincipal;
    }
    
    public EvaluacionCompetenciaArbolDto getEvaluacionCompetenciaArbolSeleccionadoDto() {
        return evaluacionCompetenciaArbolSeleccionadoDto;
    }
    
    public void setEvaluacionCompetenciaArbolSeleccionadoDto(EvaluacionCompetenciaArbolDto evaluacionCompetenciaArbolSeleccionadoDto) {
        this.evaluacionCompetenciaArbolSeleccionadoDto = evaluacionCompetenciaArbolSeleccionadoDto;
    }
    
    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }
    
    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }
    
    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }
    
    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }
    
    public List<ParametroDto> getListaCalificacion() {
        List<ParametroDto> list = new ArrayList<ParametroDto>();
        for (ParametroDto param : this.recursosManager.obtenerParametrosActivosPorCatalogoSistemaAdd(ConstantesDesa.CatalogoParametro.ARBOL_COMPETENCIA_CALIFICACION, ConstantesDesa.Parametro.ARBOL_EVAL_COMP_NINGUNO)) {
            list.add(param);
        }
        return list;
    }
    
    public void setListaCalificacion(List<ParametroDto> listaCalificacion) {
        this.listaCalificacion = listaCalificacion;
    }
    
    public SelectItem[] getSiTipoEvaluacion() {
        return this.manager.siTipoEvaluacion();
    }
    
    public void setSiTipoEvaluacion(SelectItem[] siTipoEvaluacion) {
        this.siTipoEvaluacion = siTipoEvaluacion;
    }

    public BigDecimal getPromedioFinal() {
        return promedioFinal;
    }

    public void setPromedioFinal(BigDecimal promedioFinal) {
        this.promedioFinal = promedioFinal;
    }
    
}
